Handling Errors in an API

Making an API that that returns logical responses can be a bit confusing. So I'm gonna write out an example lifted from one of my projects using NextJS and CouchDB

This script creates default users if none are found in the database. This helps automate the initial build.

api call pages/api/users/default.js

/**
 * @param {import('next').NextApiRequest} req
 * @param {import('next').NextApiResponse} res
 */

import * as Nano  from 'nano'
const bcrypt = require('bcrypt');
import usersJSON from '../../../js/defaultUsers.json'
import ROLES from '../../../js/roles_list'

const protocol = process.env.DB_PROTOCOL
const dbAdminName = process.env.DB_ADMIN_NAME
const dbAdminPass = process.env.DB_ADMIN_PASSWORD
const dbUrl = process.env.DB_ENDPOINT

export default async function defaultUser(req, res) {

  const dbEndpoint = protocol + dbAdminName + ':' + dbAdminPass + '@' + dbUrl

  try {
    const nano = Nano(dbEndpoint)
    const db = nano.db.use('users')
    const info = await db.info()

    const docCount = info.doc_count

    if(docCount === 0){
      const nano = Nano(dbEndpoint)
      const db = nano.db.use('users')
      
      console.log('-- NO USERS FOUND --');
      console.log('-- CREATING DEFAULT --');

      usersJSON.map(async (usr) => {

        const { password, roles, img } = usr

        const hashedPwd = await bcrypt.hash(password, 10);

        const user = {
          ...usr,
          img: (img) ? img : '/imgs/partyhat.svg"',
          roles: (roles) ? roles : {client: ROLES.client},
          password: hashedPwd,
          dateCreated: Date.now(),
          dateMod: Date.now()
        }

        await db.insert(user, `user:${user.email}`, function(err, body) {
          if (err) {
            console.warn('couchdb error: ',err)
          } else {
            console.log('##### DEFAULT USER CREATED', body);
          }
        });
      })

	  // make sure this res is outside the `.map` (or any looping function)
      return res.status(201).json({ status: 201, message: 'Default Users Created' })
    }

    if(docCount > 0) return res.status(202).json({ status: 202, message: 'Default Users Already Exist' })

    return res.status(202).json({ status: 202, message: 'something else happened successfully with users' })

  } catch (err) {
    console.error('connect to users db: ',err)
    return res.status(400).json({ status: 'failed info', message: err.toString() })
  }
  
}

Credits